<template>
  <div class="app-container">
    <el-form label-width="70px" :inline="true" size="small">
      <el-form-item label="角色名称">
        <el-input style="width: 100%" v-model="searchObj.roleName" placeholder="角色名称"></el-input>
      </el-form-item>
      <el-button type="primary" icon="el-icon-search" size="mini" @click="fetchData()">搜索</el-button>
      <el-button icon="el-icon-refresh" size="mini" @click="resetData">重置</el-button>
    </el-form>
    <el-form label-width="70px" :inline="true" size="small">
      <el-button
        type="success"
        icon="el-icon-plus"
        size="mini"
        :disabled="$hasBP('bnt.sysRole.add') === false"
        @click="add"
      >添 加
      </el-button>
      <el-button class="btn-add" size="mini" @click="batchRemove()">批量删除</el-button>
    </el-form>
    <!-- 表格 -->
    <el-table
      v-loading="listLoading"
      :data="list"
      stripe
      border
      style="width: 100%;margin-top: 10px;"
      @selection-change="handleSelectionChange"
    >
      <el-table-column type="selection"/>
      <el-table-column
        label="序号"
        width="70"
        align="center"
      >
        <template slot-scope="scope">
          {{ (page - 1) * limit + scope.$index + 1 }}
        </template>
      </el-table-column>

      <el-table-column prop="roleName" label="角色名称" align="center"/>
      <el-table-column prop="roleCode" label="角色编码" align="center"/>
      <el-table-column prop="createTime" label="创建时间" align="center"/>
      <el-table-column label="操作" width="250" align="center">
        <template slot-scope="scope">
          <el-button
            type="primary"
            icon="el-icon-edit"
            size="mini"
            :disabled="$hasBP('bnt.sysRole.update')  === false"
            @click="edit(scope.row.id)"
            title="修改"
          />
          <el-button
            type="danger"
            icon="el-icon-delete"
            size="mini"
            :disabled="$hasBP('bnt.sysRole.remove')  === false"
            @click="removeDataById(scope.row.id)"
            title="删除"
          />
          <el-button
            type="warning"
            icon="el-icon-baseball"
            size="mini"
            @click="showAssignAuth(scope.row)"
            title="分配权限"
          />
          <el-button
            type="info"
            icon="el-icon-star-off"
            size="mini"
            @click="showDataScope(scope.row)"
            title="数据权限"
          />
        </template>
      </el-table-column>
    </el-table>

    <!-- 分页组件 -->
    <el-pagination
      :current-page="page"
      :total="total"
      :page-size="limit"
      style="padding: 30px 0; text-align: center;"
      layout="total, prev, pager, next, jumper"
      @current-change="fetchData"
    />

    <el-dialog :title="this.title" :visible.sync="dialogVisible" width="40%">
      <el-form ref="dataForm" :model="sysRole" label-width="150px" size="small" style="padding-right: 40px;">
        <el-form-item label="角色名称">
          <el-input v-model="sysRole.roleName"/>
        </el-form-item>
        <el-form-item label="角色编码">
          <el-input v-model="sysRole.roleCode"/>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false" size="small" icon="el-icon-refresh-right">取 消</el-button>
        <el-button type="primary" icon="el-icon-check" @click="saveOrUpdate()" size="small">确 定</el-button>
      </span>
    </el-dialog>

    <el-dialog :title="title" :visible.sync="openDataScope" width="500px" append-to-body>
      <el-form :model="sysRole" label-width="80px">
        <el-form-item label="角色名称">
          <el-input v-model="sysRole.roleName" :disabled="true"/>
        </el-form-item>
        <!--        <el-form-item label="权限字符">-->
        <!--          <el-input v-model="form.roleKey" :disabled="true" />-->
        <!--        </el-form-item>-->
        <el-form-item label="权限范围">
          <el-select v-model="sysRole.dataScope" style="width: 100%" @change="dataScopeSelectChange">
            <el-option
              v-for="item in dataScopeOptions"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            ></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="数据权限" v-show="sysRole.dataScope == 2" @change="dataScopeSelectChange">
          <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
          <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
          <el-checkbox v-model="sysRole.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
          <el-tree
            class="tree-border"
            :data="deptOptions"
            show-checkbox
            default-expand-all
            ref="dept"
            node-key="id"
            :check-strictly="!sysRole.deptCheckStrictly"
            :props="defaultProps"
          ></el-tree>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitDataScope">确 定</el-button>
        <el-button @click="cancelDataScope">取 消</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
// 引入定义接口的js文件
import api from '@/api/system/role'

export default {
  // 定义初始值
  data() {
    return {
      listLoading: false, // 是否显示加载
      list: [], // 角色列表
      total: 0, // 总记录数
      page: 1, // 当前页
      limit: 3, // 每页显示记录数
      searchObj: {}, // 条件查询封装对象

      title: 'add',
      dialogVisible: false, // 弹出框
      sysRole: {
        deptCheckStrictly: true
      },
      selectValue: [], // 复选框选择内容封装数组
      deptExpand: true,
      deptNodeAll: false,

      deptOptions: [],
      openDataScope: false,
      defaultProps: {
        children: 'children', label: 'name'
      },
      dataScopeOptions: [
        { value: '1', label: '全部数据权限' },
        { value: '2', label: '自定数据权限' },
        { value: '3', label: '本部门数据权限' },
        { value: '4', label: '本部门及以下数据权限' },
        { value: '5', label: '仅本人数据权限' }
      ]
    }
  },
  //  页面渲染之前执行
  created() {
    // 调用列表方法
    this.fetchData()
  },
  methods: {
    // 跳转分配菜单权限
    showAssignAuth(row) {
      this.$router.push('/system/assignAuth?id=' + row.id + '&roleName=' + row.roleName)
    },
    // 打开分配数据权限,获取所有部门 和 角色归属部门
    showDataScope(row) {
      this.sysRole = {}
      this.title = '数据权限配置'
      this.sysRole = row
      const deptTreeSelect = this.getDeptTree(row.id)
      this.openDataScope = true
      this.$nextTick(() => {
        deptTreeSelect.then(res => {
          this.$refs.dept.setCheckedKeys(res.data.checkedKeys)
        })
      })
    },
    getDeptTree(roleId) {
      return api.deptTreeSelect(roleId).then(response => {
        this.deptOptions = response.data.depts
        return response
      })
    },
    // 复选框发生变化执行方法
    handleSelectionChange(selection) {
      this.selectValue = selection
      // console.log(this.selectValue)
    },
    // 批量删除
    batchRemove() {
      // 判断
      if (this.selectValue.length === 0) {
        this.$message.warning('请选择要删除的记录！')
        return
      }
      this.$confirm('此操作将永久删除该角色, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        // 数组
        const idList = []
        // 获取多个复选框对应id，封装到数组里面
        //  [1,2,3]
        for (let i = 0; i < this.selectValue.length; i++) {
          const obj = this.selectValue[i]
          // id值
          const id = obj.id
          // 放到数组里面
          idList.push(id)
        }
        api.batchRemove(idList).then(response => {
          // 提示
          this.$message({
            type: 'success',
            message: '删除成功!'
          })
          // 刷新
          this.fetchData()
        })
      })
    },
    // 修改-数据回显
    edit(id) {
      this.title = '修改'
      this.dialogVisible = true
      api.getRoleId(id).then(response => {
        this.sysRole = response.data
      })
    },
    // 点击确定
    saveOrUpdate() {
      // 判断添加还是修改
      if (!this.sysRole.id) {
        this.saveRole()
      } else {
        this.updateRole()
      }
    },
    // 修改的方法
    updateRole() {
      api.update(this.sysRole)
        .then(response => {
          // 提示
          this.$message({
            type: 'success',
            message: '修改成功!'
          })
          // 关闭弹框
          this.dialogVisible = false
          // 刷新页面
          this.fetchData()
        })
    },
    // 添加的方法
    saveRole() {
      api.saveRole(this.sysRole)
        .then(response => {
          // 提示
          this.$message({
            type: 'success',
            message: '添加成功!'
          })
          // 关闭弹框
          this.dialogVisible = false
          // 刷新页面
          this.fetchData()
        })
    },
    // 点击添加，弹出框
    add() {
      this.title = '添加'
      this.dialogVisible = true
      this.sysRole = {}
    },
    // 删除
    removeDataById(id) {
      this.$confirm('此操作将永久删除该角色, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        // 调用方法删除
        api.removeId(id)
          .then(response => {
            // 提示
            this.$message({
              type: 'success',
              message: '删除成功!'
            })
            // 刷新
            this.fetchData()
          })
      })
    },
    // 重置
    resetData() {
      // 清空表单
      this.searchObj = {}
      // 查询所有数据
      this.fetchData()
    },
    // 条件分页查询列表
    // pageNum 查询页数
    fetchData(pageNum = 1) {
      // 页数赋值
      this.page = pageNum
      // ajax
      api.getPageList(this.page, this.limit, this.searchObj)
        .then(response => {
          // this.listLoading = false
          // console.log(response)
          // 每页数据列表
          this.list = response.data.records
          // 总记录数
          this.total = response.data.total
        })
    },

    /** 选择角色权限范围触发 */
    dataScopeSelectChange(value) {
      if (value !== '2') {
        this.$refs.dept.setCheckedKeys([])
      }
    },

    // 树权限（展开/折叠）
    handleCheckedTreeExpand(value, type) {
      if (type === 'menu') {
        const treeList = this.menuOptions
        for (let i = 0; i < treeList.length; i++) {
          this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value
        }
      } else if (type === 'dept') {
        const treeList = this.deptOptions
        for (let i = 0; i < treeList.length; i++) {
          this.$refs.dept.store.nodesMap[treeList[i].id].expanded = value
        }
      }
    },
    // 树权限（全选/全不选）
    handleCheckedTreeNodeAll(value, type) {
      if (type === 'menu') {
        this.$refs.menu.setCheckedNodes(value ? this.menuOptions : [])
      } else if (type === 'dept') {
        this.$refs.dept.setCheckedNodes(value ? this.deptOptions : [])
      }
    },
    // 树权限（父子联动）
    handleCheckedTreeConnect(value, type) {
      if (type === 'menu') {
        this.sysRole.menuCheckStrictly = !!value
      } else if (type === 'dept') {
        this.sysRole.deptCheckStrictly = !!value
      }
    },
    /** 提交按钮（数据权限） */
    submitDataScope: function() {
      if (this.sysRole.id !== undefined) {
        this.sysRole.deptIds = this.getDeptAllCheckedKeys()
        api.dataScope(this.sysRole).then(res => {
          if (res.code === 200) {
            this.$message.success('分配成功')
            this.openDataScope = false
            this.fetchData()
          }
        })
      }
    },
    // 所有部门节点数据
    getDeptAllCheckedKeys() {
      // 目前被选中的部门节点
      const checkedKeys = this.$refs.dept.getCheckedKeys()
      // 半选中的部门节点
      const halfCheckedKeys = this.$refs.dept.getHalfCheckedKeys()
      checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
      return checkedKeys
    },
    // 取消按钮（数据权限）
    cancelDataScope() {
      this.openDataScope = false
      this.sysRole = {}
    }

  }
}
</script>
